package com.tdam2011.grupo06.gui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.PaintDrawable;
import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.control.DatabaseHelper;
import com.tdam2011.grupo06.control.GestorMensajes;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.ItemHistorial;
import com.tdam2011.grupo06.model.MensajeBob;
import com.tdam2011.grupo06.network.ResultParserSax;
import com.tdam2011.grupo06.network.XmlResultHandler;

public class ListadoMensajesBob extends ListActivity implements OnClickListener
{
	private LinearLayout linearLay;
	private ItemMensajeBobAdapter adapter;
	private CargarMensajesTask cargarMensajesTask;
	private GestorMensajes gestorMensajes;
	private int idContacto;
	private String resultInfo;
	private EditText editTextMensaje;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista_mensajes_bob);
		idContacto = getIntent().getExtras().getInt("idContacto");
		adapter = new ItemMensajeBobAdapter();
		gestorMensajes = new GestorMensajes(this,adapter);
		Contacto aux = new Contacto();
		aux.setTableID(idContacto);
		DatabaseHelper.getInstance(this).actualizarLeidosMensajesDeContacto(aux);
		cargarMensajesTask = new CargarMensajesTask();
		linearLay = (LinearLayout) findViewById(R.id.linearLayoutListaMensajesBob);
		setListAdapter(adapter);
		registerForContextMenu(getListView());
		
		editTextMensaje = (EditText) findViewById(R.id.enviarTxtMensaje);
		Button btnEnviar = (Button) findViewById(R.id.enviarBtnEnviar);
		btnEnviar.setOnClickListener(this);
		cargarMensajesTask.execute("");
	}
	
	@Override
	protected void onResume() 
	{
		super.onResume();
	}
	
	@Override
	protected void onPause() 
	{
		super.onPause();
	}

	@Override
	protected void onStop() 
	{
		super.onStop();
	}
	
	public class ItemMensajeBobAdapter extends BaseAdapter 
	{
		private ArrayList<MensajeBob> itemsMensajes;
		private LayoutInflater inflater;
		private int cantMen;

		public ItemMensajeBobAdapter() 
		{
			itemsMensajes = new ArrayList<MensajeBob>();
			inflater = LayoutInflater.from(ListadoMensajesBob.this);
			cantMen = 0;
		}

		public void addItemBob(MensajeBob info) {
			if (info != null) 
			{
				itemsMensajes.add(info);

				if(info instanceof MensajeBob) 
				{
					cantMen++;
				}
			}
		}
		

		public int getCount() {
			return itemsMensajes.size();
		}

		public Object getItem(int position) {
			return itemsMensajes.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public void ordenarMensajes(Comparator<ItemHistorial> comparadorFechaAsc)
		{
			Collections.sort(itemsMensajes, comparadorFechaAsc);
		}
		
			
		public int getCantMen()
		{
			return cantMen;
		}

		public void emptyLists()
		{
			itemsMensajes.clear();
			cantMen = 0;
		}
		
		class Holder 
		{
			private TextView txtContenido;
			private TextView txtFecha;
			private LinearLayout layout;
		}

		public View getView(int position, View convertView, ViewGroup arg2) 
		{
			Holder holder;
			if (convertView == null) 
			{
				convertView = inflater.inflate(R.layout.item_mensajebob, null);
				holder = new Holder();
				holder.txtContenido = (TextView) convertView.findViewById(R.id.item_mensajebob_contenido);
				holder.txtFecha = (TextView) convertView.findViewById(R.id.item_mensajebob_fecha);
				holder.layout = (LinearLayout) convertView.findViewById(R.id.item_mensajebob_layout);
				convertView.setTag(holder);
			} 
			else 
			{
				holder = (Holder) convertView.getTag();
			}

			MensajeBob info = (MensajeBob) getItem(position);
			
			holder.txtContenido.setText(info.getContent());
			holder.txtFecha.setText(info.getFechaString());
			
			if(info.getTipo() == MensajeBob.enviado)
			{
				holder.layout.setGravity(Gravity.LEFT);
				holder.layout.setPadding(0, 0, 20, 0);
				
				float[] radii = {15.0f, 15.0f, 15.0f, 15.0f, 15.0f, 15.0f, 0.0f, 0.0f};
		        
		        PaintDrawable pd = new PaintDrawable(Color.rgb(247, 157, 23));
		        pd.setCornerRadii(radii);
		        
		        				
				holder.layout.setBackgroundDrawable(pd);
				holder.layout.setPadding(5,5,30,5);
				
				holder.txtContenido.setGravity(Gravity.LEFT);
				holder.txtFecha.setGravity(Gravity.LEFT);
				holder.txtContenido.setPadding(0,0,30,0);
				holder.txtFecha.setPadding(0,0,30,0);
				holder.txtFecha.setTextColor(Color.BLACK);
			}
			else if(info.getTipo() == MensajeBob.recibido)
			{
				holder.layout.setGravity(Gravity.RIGHT);
				holder.layout.setPadding(20, 0, 0, 0);
				
				float[] radii = {15.0f, 15.0f, 15.0f, 15.0f, 00.0f, 00.0f, 15.0f, 15.0f};
		        
		        PaintDrawable pd = new PaintDrawable(Color.GRAY);
		        pd.setCornerRadii(radii);
		        				
				holder.layout.setBackgroundDrawable(pd);
				holder.layout.setPadding(30,5,5,5);
				
				holder.txtContenido.setGravity(Gravity.RIGHT);
				holder.txtFecha.setGravity(Gravity.RIGHT);
				holder.txtContenido.setPadding(30, 0,0, 0);
				holder.txtFecha.setPadding(30, 0,0, 0);
				holder.txtFecha.setTextColor(Color.BLACK);
			}
			
			return convertView;
		}
	}
	
	private class CargarMensajesTask extends AsyncTask<String, Void, Contacto>
	{
		@Override
		protected Contacto doInBackground(String... params) 
		{
			adapter.emptyLists();
			return gestorMensajes.cargarMensajesUsuario(idContacto);
		}
		
		protected void onPostExecute(Contacto result)
		{
			if(result.getNombre()!=null){
				((TextView) findViewById(R.id.txtMensajeBobNombre)).setText(result.getNombre()+" ("+result.getUsuario()+")");
			}
			else{
				((TextView) findViewById(R.id.txtMensajeBobNombre)).setText(result.getUsuario());
			}
			((ImageView) findViewById(R.id.imageViewMensajeBob)).setImageURI( result.getPhotoUri());
			adapter.notifyDataSetChanged();
			linearLay.setVisibility(View.GONE);
			getListView().setSelection(adapter.getCount());
		}
	}
	
	protected Dialog onCreateDialog(int id) {
		Dialog dialog = null;
		if (id == 1) {
			dialog = new AlertDialog.Builder(this)
					.setIcon(R.drawable.ic_alert)
					.setPositiveButton("Ok", null)
					.setMessage(
							getResources().getString(
									R.string.errorEnvioFaltaMensaje))
					.setTitle("Error").create();
		} else if (id == 2) {
			dialog = new AlertDialog.Builder(this)
					.setIcon(R.drawable.ic_alert)
					.setPositiveButton("Ok", null)
					.setMessage(
							getResources().getString(
									R.string.errorConexionEnvioMensaje))
					.setTitle("Error").create();
		} else if (id == 3) {
			dialog = new AlertDialog.Builder(this)
					.setIcon(R.drawable.ic_alert)
					.setPositiveButton("Ok", null)
					.setMessage(
							getResources()
									.getString(R.string.errorEnvioMensaje)
									+ " " + resultInfo).setTitle("Error")
					.create();
		} else {
			dialog = super.onCreateDialog(id);
		}
		return dialog;
	}

	protected void onPrepareDialog(int id, Dialog dialog) {
		if (id == 3) {
			((AlertDialog) dialog).setMessage(getResources().getString(
					R.string.errorEnvioMensaje)
					+ " " + resultInfo);
		}
		super.onPrepareDialog(id, dialog);
	}

	@Override
	public void onClick(View v) {
		ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		DatabaseHelper db = DatabaseHelper.getInstance(this);
		String mensaje = editTextMensaje.getText().toString();
		Contacto usuario = new Contacto();
		usuario.setTableID(idContacto);		
		String para = db.getContactByTableId(usuario).getUsuario();
		if (mensaje.compareTo("") == 0) {
			showDialog(1);
		} else if (connectivityManager.getActiveNetworkInfo() == null) {
			showDialog(2);
		} else {
			SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(ListadoMensajesBob.this);
			ResultParserSax parser = new ResultParserSax();
			String result[] = parser.requestSendMessage(myPreference.getString("nombreUsuario", ""), myPreference.getString("contrasenaUsuario", ""), para,mensaje);
			resultInfo = result[1];
			Log.e("MessageSender", "Message Send Status: "+result[0]+"\nResult: "+result[1]);
			int resultInt = Integer.parseInt(result[0]);
			if (resultInt == XmlResultHandler.resultCorrect) {
				((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(editTextMensaje.getWindowToken(), 0);
				editTextMensaje.setText("");
				MensajeBob msj = new MensajeBob(0, MensajeBob.enviado,GregorianCalendar.getInstance().getTime(),mensaje, para);
				msj.setIdContacto(idContacto);
				db.addMensajeBob(msj);
				Toast.makeText(this,getResources().getString(R.string.correctoEnvioMensaje),Toast.LENGTH_SHORT).show();
				cargarMensajesTask = new CargarMensajesTask();
				cargarMensajesTask.execute("");
				setResult(RESULT_OK, new Intent());
			} else {
				showDialog(3);
			}
		}
	}
	
	public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) 
	{
		super.onCreateContextMenu(menu, v, menuInfo);
		menu.setHeaderTitle("Acciones de mensajes");
		menu.add(0, ((AdapterView.AdapterContextMenuInfo)menuInfo).position, 1, "Eliminar mensaje");
	}
	
	public boolean onContextItemSelected(MenuItem item) 
	{
		switch(item.getOrder())
		{
			case 1:
				MensajeBob itemMensajeBob = (MensajeBob) adapter.getItem(item.getItemId());
				DatabaseHelper.getInstance(this).eliminarItemHistorial(itemMensajeBob);
				Toast.makeText(this, "Mensaje eliminado",Toast.LENGTH_SHORT).show();
				gestorMensajes.actualizar();
				cargarMensajesTask = new CargarMensajesTask();
				cargarMensajesTask.execute("");
				setResult(RESULT_OK, new Intent());
				return true;
			default:
				return super.onContextItemSelected(item);
		}
    }
}
